package com.cneport.das.common.validate;

import java.lang.reflect.Field;
import java.lang.reflect.Method;


/**
 * @Desc 类型验证工具类
 * @Ver 1.0
 * @Author GavinZhang
 * @Company 东方物通科技有限（北京）公司
 * @Date 2021-12-28 12:45:20
 */
public class FieldCheckUtil {
    public static ResultVO validate(Object t, ResultVO vo) {
        if (vo == null) {
            vo = new ResultVO();
        }
        if (t == null) {
            vo.addError("校验主体不存在！");
            return vo;
        }
        //获取注解和方法
        Field[] declaredFields = t.getClass().getDeclaredFields();
        if (declaredFields != null && declaredFields.length > 0) {

            for (Field field : declaredFields) {

                FieldCheck fieldCheck = field.getAnnotation(FieldCheck.class);
                if (fieldCheck == null) {
                    continue;
                }
                FvEnum fnType = fieldCheck.type();

                // 属性名称
                String name = field.getName();
                // 属性类型
                String type = field.getGenericType().toString();
                Object value = null;
                // 将属性的首字符大写，方便构造get，set方法
                name = name.substring(0, 1).toUpperCase() + name.substring(1);
                try {
                    // 获取方法
                    Method m = t.getClass().getMethod("get" + name);
                    // 调用getter方法获取属性值
                    value = m.invoke(t);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (type.equals("class java.lang.String")) {
                    vo = fnType.validate(fieldCheck, name, (String) value, vo);
                } else if (type.equals("class java.lang.Integer")) {
                    vo = fnType.validate(fieldCheck, name, (Integer) value, vo);
                } else if (type.equals("class java.lang.Double")) {
                    vo = fnType.validate(fieldCheck, name, (Double) value, vo);
                }

            }
        }
        return vo;
    }

}
